#ifndef __MYMATH_H__
#define __MYMATH_H__

#include "stm32f4xx.h"
#include "arm_math.h"
#include "math.h"

/* 数学函数简单宏定义函数 */
#define ABS(x) ( (x)>0?(x):-(x) )
#define LIMIT( x,min,max ) ( (x) < (min)  ? (min) : ( (x) > (max) ? (max) : (x) ) )
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))




typedef  struct  ramp_function_source_t
{
    float input;        //输入数据
    float out;          //输出数据
    float min_value;    //限幅最小值
    float max_value;    //限幅最大值
    float frame_period; //时间间隔
} ramp_function_source_t;


/**
斜波函数初始化  RM  
波函数结构体    间隔的时间，单位 s     最大    最小值
  */
void ramp_init(ramp_function_source_t *ramp_source_type, float frame_period, float max, float min);

//斜波函数结构体 输入值  滤波参数
void ramp_calc(ramp_function_source_t *ramp_source_type, float input);

typedef  struct first_order_filter_type_t
{
	
	  
	  u8 Threshold;         //采样差的最大阈值   8 
	  u8 Threshold_2;         //增强滤波参数k的阈值
//30
	 
  	float growth;         //k的增涨值+0.2
	  float stable;       //角度变化稳定时K_x值，看实际修改
    
		u8 old_flag;        //上一次标志位
	  u8 flag;            //本次标志位
	  u8 Filter_counter;    //滤波计数器
	  float k;           //参数自动变化
	  float input;        //输入数据
    float out;          //滤波输出的数据
    float num;          // 普通一阶滤波参数
    float frame_period; //普通一阶滤波的时间间隔 单位 s
} first_order_filter_type_t;

// 一阶低通滤波结构体   间隔的时间，单位 s    滤波参数
//void first_order_filter_init(first_order_filter_type_t* first_order_filter_type, const float num[1]);
// 一阶低通滤波结构体   间隔的时间，单位 s
void first_order_filter_cali(first_order_filter_type_t* first_order_filter_type);

void   filter_cali_Reset(first_order_filter_type_t* motor_type);

void  set_filter_cali(first_order_filter_type_t* motor_type,float num,float frame_period);

void first_order_RAM_filter_cali(first_order_filter_type_t* first_order_filter_type)  ;//一阶动态滤波


/*----------------------------------------------------------
 + 实现功能：死区控制：减去zoom值
----------------------------------------------------------*/
extern float my_deathzoom(float x,float zoom);

/*----------------------------------------------------------
 + 实现功能：死区控制：绝对值zoom内清零
----------------------------------------------------------*/
extern float my_deathzoom_2(float x,float zoom);

/*----------------------------------------------------------
 + 实现功能：角度范围控制在+-180角度
----------------------------------------------------------*/
extern float To_180_degrees(float x);

/*----------------------------------------------------------
 + 实现功能：快速反正切计算
----------------------------------------------------------*/
extern float fast_atan2(float y, float x);

//快速开方


float sign(float value);

#endif
